#include <semaphore.h>
#include <stdio.h>
#include <pthread.h>

#define M 10
#define N 20

sem_t sdata, sread;

void * writer(void *p){
    sem_wait(&sdata);
    for(int i=0; i<N; i++ )
           sem_wait(&sread); 
    printf("Writing dataset\n");
    for(int i=0; i<N; i++ )
           sem_post(&sread); 
    sem_post(&sdata);
    return NULL;
}

void * reader(void *p){
    sem_wait(&sdata);
    sem_wait(&sread);
    sem_post(&sdata);
    printf("Reading dataset\n");
    sem_post(&sread);
    return NULL;
}

int main(void)
{
    sem_init(&sdata, 0, 1); 
    sem_init(&sread, 0, N);    
    pthread_t tid[M], tid2[M];
    for(int i=0; i<M; i++) 
        pthread_create(&tid[i], NULL, writer, NULL);
    for(int i=0; i<M; i++) 
        pthread_create(&tid2[i], NULL, reader, NULL);
    sem_destroy(&sdata); 
    pthread_join(tid[M-1], NULL);
}
